[AWS IoT Greengrass V2] RaspberryPIにインストールしてみました
1 はじめに
IoT事業部の平内(SIN)です。
AWS IoT Greengrass V2(以下、Greengrass V2)は、Greengrass クラシック (V1)とは、まったくの別物だという話を聞いて気になっていたのですが、なかなか触れていませんでした。
今回は、重い腰を上げて、インストールから初めてみました。
使用したデバイスは、RaspberryPi 4B(8G)で、OSは、今年5月の最新版(Raspberry Pi OS (32-bit) with desktop and recommended software)です。
https://www.raspberrypi.org/software/
$ cat /proc/cpuinfo | grep Revision Revision : d03114 $ lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 10 (buster) Release: 10 Codename: buster $ uname -a Linux device-001 5.10.17-v7l+ #1414 SMP Fri Apr 30 13:20:47 BST 2021 armv7l GNU/Linux
2 Javaランタイム
Greengrass V2は、Javaで作成されているため、ランタイムのインストールが必要です。
$ sudo apt install default-jdk
今回、使用した、RasPIイメージには、既にインストールされているため、この作業は必要ありませんでした。
$ java -version openjdk version "11.0.11" 2021-04-20 OpenJDK Runtime Environment (build 11.0.11+9-post-Raspbian-1deb10u1) OpenJDK Server VM (build 11.0.11+9-post-Raspbian-1deb10u1, mixed mode)
3 セットアップ
2021/08/12 更新
インストールコマンドで使用しているjarファイルは、Greengrassそのものでした。
以下、一部、内容を修正しました。
-rw-r--r-- 1 pi pi 51383591 Aug 3 05:59 /home/pi/GreengrassCore/lib/Greengrass.jar
-r-xr-xr-x 1 pi pi 51383591 Aug 3 05:59 /greengrass/v2/packages/artifacts-unarchived/aws.greengrass.Nucleus/2.4.0/aws.greengrass.nucleus/lib/Greengrass.jar
Greengrassのセットアップは、AWSコンソールに表示されるコマンドをコピーするだけで簡単に行うことができます。
- コアデバイス名とグループ名の決定
- AWS認証情報の設定
- Greegrassのダウンロード
- インストール実行
(1) コアデバイス名とグループ名の決定
AWS IoTコンソールで、Greegrass - コアデバイス - 1 つの Greengrass コアデバイスをセットアップ と辿ります。
表示された画面で、「コアデバイス名」と、所属させる「グループ名」を設定します。(今回は、「gg-device-001」「gg-group」としました)
ここに名前を入力する事で、下(ステップ3.3)に表示されている「インストーラの実行」のコマンドが変更されます。事後、そのままコピーして、デバイス上実行することで、この名前が利用されます。
(2) AWS認証情報の設定
「インストーラの実行」のために、AWSの認証情報が必要です。下記では、インストーラーを実行するシェルで環境変数に認証情報をセットしています。
$ export AWS_DEFAULT_REGION=ap-northeast-1 $ export AWS_ACCESS_KEY_ID=xxxxxx $ export AWS_SECRET_ACCESS_KEY=xxxxxx $ export AWS_SESSION_TOKEN=xxxxxx
必要なポリシーについては、下記に記載されていました。
参考:インストーラーがリソースをプロビジョニングするための最小限の IAM ポリシー
(3) Greegrassのダウンロード
下記のコマンドで、Greegrassをデバイス上にダウンロードして展開します。
$ curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip && unzip greengrass-nucleus-latest.zip -d GreengrassCore
展開されるファイルは、以下のようになっていました。lib/Greengrass.jarが、Greegrass本体です。
$ tree ./GreengrassCore ./GreengrassCore ├── bin │ ├── greengrass.service.template │ ├── loader │ └── loader.cmd ├── conf │ └── recipe.yaml ├── lib │ └── Greengrass.jar ├── LICENSE ├── NOTICE ├── README.md └── THIRD-PARTY-LICENSES
(4) インストール実行
Greegrassは、インストール機能もあり、その実行コマンドが、IoT Coreコンソールで表示されているので、これをコピーしてそのまま利用できます。 表示されているコマンドは、設定したコアデバイス名とグループ名が反映されています。
$ sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE -jar ./GreengrassCore/lib/Greengrass.jar --aws-region ap-northeast-1 --thing-name gg-device-001 --thing-group-name gg-group --component-default-user ggc_user:ggc_group --provision true --setup-system-service true --deploy-dev-tools true
Successfullyが表示されて、インストーラの実行はすぐに完了しますが、実際にコアデバイスの登録や、コンポーネントのインストールが完了するまでは、しばらく待つ必要があります。
Successfully set up Nucleus as a system service
4 確認
(1) コアデバイス
コアデバイスの登録が完了すると、AWSコンソールから確認できます。
(2) コンポーネント
また、「コンポーネント」タブで、Greengrass コマンドラインインターフェイス (CLI) も確認できます。
Greengrass CLI は、AWS IoT Greengrassデバイスのコアを使用して、ローカルでコンポーネントを開発するために利用されるパブリックコンポーネントの1つですが、インストーラのパラメータで --deploy-dev-tools true が指定されているためインストールされたものです。
参考:Greengrass コマンドラインインターフェイス
デバイス上では、下記のパスから利用できます。
$ /greengrass/v2/bin/greengrass-cli -V Greengrass CLI Version: 2.4.0
※ ローカル開発を行わない場合は、インストールの必要はありません。
(3) モノ
コアデバイスは、モノとしても登録されます。
指定したグループに所属していることも確認できます。
(4) 証明書
モノには、証明書が紐づいています。
デバイス上では、証明書(秘密鍵)は、/greengrass/v2に配置されています。
$ ls -al /greengrass/v2 total 60 drwxr-xr-x 12 root root 4096 Aug 10 19:14 . drwxr-xr-x 3 root root 4096 Aug 10 19:14 .. drwx------ 3 root root 4096 Aug 10 19:14 alts drwxr-xr-x 2 root root 4096 Aug 10 19:21 bin drwxr-xr-x 2 root root 4096 Aug 10 19:21 cli_ipc_info drwx------ 2 root root 4096 Aug 10 19:14 config drwx------ 3 root root 4096 Aug 10 19:21 deployments srw-rw-rw- 1 root root 0 Aug 10 19:14 ipc.socket drwx------ 2 root root 4096 Aug 10 19:14 logs drwxr-xr-x 5 root root 4096 Aug 10 19:14 packages drwx------ 4 root root 4096 Aug 10 19:14 plugins -rw-r--r-- 1 root root 1675 Aug 10 19:14 privKey.key -rw-r--r-- 1 root root 1188 Aug 10 19:14 rootCA.pem drwxr-xr-x 2 root root 4096 Aug 10 19:14 telemetry -rw-r--r-- 1 root root 1224 Aug 10 19:14 thingCert.crt drwxr-xr-x 2 root root 4096 Aug 10 19:14 work
SHA256のフィンガープリントを見ると、AWSコンソール上の「証明書ID」と一致していることが確認できます。
$ openssl x509 -noout -fingerprint -sha256 -in thingCert.crt SHA256 Fingerprint=2C:AD:81:CB:BD:2A:5B:5D:13:39:D3:5E:69:0E:06:46:75:EB:04:E2:CA:D6:8C:FF:A3:85:A6:A5:57:42:F3:08
(5) ポリシー
証明書に紐づいたポリシーは、以下の2つです。
- GreengrassV2IoTThingPolicy
- GreengrassTESCertificatePolicyGreengrassV2TokenExchangeRoleAlias
GreengrassV2IoTThingPolicy
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect", "iot:Publish", "iot:Subscribe", "iot:Receive", "greengrass:*" ], "Resource": "*" } ] }
GreengrassTESCertificatePolicyGreengrassV2TokenExchangeRoleAlias
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iot:AssumeRoleWithCertificate", "Resource": "arn:aws:iot:ap-northeast-1:xxxxxxxxxxxx:rolealias/GreengrassV2TokenExchangeRoleAlias" } }
(6) ロールエリアス
ポリシーで許可されているロールエリアスは、GreengrassV2TokenExchangeRoleAliasです。
エリアス元のIAMポリシーは、以下の通りでした。
GreengrassV2TokenExchangeRoleAccess
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:DescribeCertificate", "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams", "s3:GetBucketLocation" ], "Resource": "*" } ] }
(7) サービス
インストーラーのパラメータで、--setup-system-service true が指定されているので、コアは、デバイス上でサービスとして起動しています。
$ sudo systemctl status greengrass.service ● greengrass.service - Greengrass Core Loaded: loaded (/etc/systemd/system/greengrass.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2021-08-10 19:14:50 BST; 46min ago Main PID: 5646 (sh) Tasks: 45 (limit: 4915) CGroup: /system.slice/greengrass.service ├─5646 /bin/sh /greengrass/v2/alts/current/distro/bin/loader └─5651 java -Dlog.store=FILE -Dlog.store=FILE -Droot=/greengrass/v2 -jar /greengrass/v2/alts/current/distro/lib/Gree Aug 10 19:14:50 device-001 sh[5646]: JVM options: -Dlog.store=FILE -Droot=/greengrass/v2 Aug 10 19:14:50 device-001 sh[5646]: Nucleus options: --setup-system-service false Aug 10 19:14:54 device-001 sh[5646]: SLF4J: Failed to load class "org.slf4j.impl.StaticMDCBinder". Aug 10 19:14:54 device-001 sh[5646]: SLF4J: Defaulting to no-operation MDCAdapter implementation. Aug 10 19:14:54 device-001 sh[5646]: SLF4J: See http://www.slf4j.org/codes.html#no_static_mdc_binder for further details. Aug 10 19:14:55 device-001 sh[5646]: Launching Nucleus... Aug 10 19:14:55 device-001 sh[5646]: AWS libcrypto resolve: searching process and loaded modules Aug 10 19:14:55 device-001 sh[5646]: AWS libcrypto resolve: found static aws-lc HMAC symbols Aug 10 19:14:55 device-001 sh[5646]: AWS libcrypto resolve: found static aws-lc libcrypto 1.1.1 EVP_MD symbols Aug 10 19:14:59 device-001 sh[5646]: Launched Nucleus successfully.
(8) ログ
コアデバイスのログは、/greengrass/v2/logs/greengrass.logとなっています。
$ sudo tail -f /greengrass/v2/logs/greengrass.log 2021-08-10T18:21:15.892Z [INFO] (pool-2-thread-11) com.aws.greengrass.deployment.DeploymentDirectoryManager: Persist link to last deployment. {link=/greengrass/v2/deployments/previous-success} 2021-08-10T18:21:16.514Z [INFO] (Thread-3) com.aws.greengrass.deployment.IotJobsHelper: Received empty jobs in notification . {ThingName=gg-device-001}
また、コンポーネントのログもこのディレクトリに生成されるとのことです。
$ sudo ls -la /greengrass/v2/logs total 56 drwx------ 2 root root 4096 Aug 10 19:14 . drwxr-xr-x 12 root root 4096 Aug 10 19:14 .. -rw-r--r-- 1 root root 0 Aug 10 19:14 aws.greengrass.Nucleus.log -rw-r--r-- 1 root root 47398 Aug 10 19:21 greengrass.log -rw-r--r-- 1 root root 0 Aug 10 19:14 main.log
5 最後に
今回は、Greengrass V2をRasberryPiにインストールしてみました。
まだ、インストールしただけですが、Dockerで構成されたGreengrass クラシック (V1)より、ぐっとシンプルな構成になっているように感じています。
6 参考リンク
[AWS IoT Greengrass V2] RaspberryPIにインストールしてみました
[AWS IoT Greengrass V2] RaspberryPIでコンポーネントを作成してみました
[AWS IoT Greengrass V2] クラウド側から複数のコアデバイスにコンポーネントをデプロイしてみました
[AWS IoT Greengrass V2] クラウド側からコンポーネントを削除してみました
[AWS IoT Greengrass V2] ローカルデバッグコンソール(aws.greengrass.LocalDebugConsole)を使用してみました
[AWS IoT Greengrass V2] Lambda関数(コンポーネント)をデプロイしてみました
[AWS IoT Greengrass V2] コンポーネントからIoT CoreのメッセージブローカーにPublish/Subscribeしてみました
[AWS IoT Greengrass V2] コンポーネントからシークレットマネージャにアクセスしてみました